package tree_map_set;

import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * Description: TreeMap、TreeSet底层 是 特殊的二叉搜索树 -》红黑树 所以先熟悉普通的二叉搜索树
 * User: 86187
 * Date: 2022-08-13
 * Time: 21:11
 */

public class TestMyTreeMap {

    public static void main(String[] args) {
        //HashMap 中 key 和 value 都可以为 null
        Map<String,Integer> map = new HashMap<>();

        map.put("abc",10);
        map.put("hello",3);
        map.put("bite",8);
        System.out.println("打印HashMap:"+map);
            //打印结果：{abc=10, bite=8, hello=3}  虽然是有序的，但不是按照存储数据的顺序打印元素
            //也不会按照大小顺序去存储元素 ---》 HashMap的存储是根据底层的哈希函数去找对应的位置的。现在的结果
            //有序，是因为HashMap 根据 key 和 哈希函数进行存储时 放的位置正好有序

        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        //遍历
        for (Map.Entry<String, Integer> entry :entrySet) {
            System.out.println("key:"+entry.getKey()+" val:"+entry.getValue());
        }

        Collection<Integer> collection = map.values();
        System.out.println(collection);


    }

    /**
     *  Map 的常用方法：
     *
     * 1.V get(Object key)       ---》    返回 key 对应的 value
     *
     * 2.V getOrDefault(Object key, V defaultValue)    ---》   返回 key 对应的 value，key 不存在，返回默认值
     *
     * 3.V put(K key, V value)        ---》    设置 key 对应的 value
     *
     * 4.V remove(Object key)         ---》    删除 key 对应的映射关系
     *
     * 5.Set<K> keySet()              ---》    返回所有 key 的不重复集合
     *
     * 6.Collection<V> values()       ---》    返回所有 value 的可重复集合
     *
     * 7.Set<Map.Entry<K, V>> entrySet()   ---》   返回所有的 key-value 映射关系
     *
     * 8.boolean containsKey(Object key)  ---》    判断是否包含 key
     *
     * 9.boolean containsValue(Object value)  ---》    判断是否包含 value
     */
    public static void main3(String[] args) {
        Map<String,Integer> map = new TreeMap<>();

        map.put("abc",10); //key值为 abc  出现了10次
        map.put("hello",3);
        map.put("bite",8);
            //打印结果：{abc=10, bite=8, hello=3} 因为底层是搜索树，放元素是会根据key比较大小
            //因此 key 必须是可比较的!!!尤其注意自定义类型！！不可比较时要用比较器(在堆那讲解的)

        //重点：
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        //遍历
        for (Map.Entry<String, Integer> entry :entrySet) {
            System.out.println("key:"+entry.getKey()+" val:"+entry.getValue());
        }

        /*
        了解：
         Map<String,Integer> map = new TreeMap<>();

        map.put("abc",10); //key值为 abc  出现了10次
        map.put("hello",3);
        map.put("bite",8);
            //打印结果：{abc=10, bite=8, hello=3} 因为底层是搜索树，放元素是会根据key比较大小
            //因此 key 必须是可比较的!!!尤其注意自定义类型！！不可比较时要用比较器(在堆那讲解的)

        //返回key的所有集合
        Set<String> set = map.keySet();
        System.out.println(set);
        //返回value的所有集合
        Collection<Integer> collection = map.values();
        System.out.println(collection); //顺序与key的顺序相同

        System.out.println(map);
        //map.put(null,2); 不可以放null
        map.put("bite",12); //当放入的key一样是，后放入的key的value会覆盖前面的value

        System.out.println(map);
        System.out.println(map.get("hello"));
        System.out.println(map.get("helloBite"));
        System.out.println(map.getOrDefault("helloBite",50));
         */

    }

    public static void main2(String[] args) {
        //Map实例化
        Map<String,Integer> map = new TreeMap<>(); //底层是红黑树，查找是O(lonN)
        Map<String,Integer> map2 = new HashMap<>(); //底层是哈希表，查找是O(1)
        //Set实例化
        Set<String> set = new TreeSet<>(); //底层是红黑树，查找是O(lonN)
        Set<String> set2 = new HashSet<>(); //底层是哈希表，查找是O(1)

    }

    public static void main1(String[] args) {

        BinarySearchTree binarySearchTree = new BinarySearchTree();
        int[] elem = {80,30,48,60,90,56};

        for (int val : elem) {
            binarySearchTree.insert(val);
        }
        binarySearchTree.inorder(binarySearchTree.root);
        System.out.println();

        binarySearchTree.remove(30);
        binarySearchTree.remove(48);
        binarySearchTree.remove(90);
        binarySearchTree.inorder(binarySearchTree.root);
        System.out.println();

    }
}
